package net.hctek.AnnouncerStation.action;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;

import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.opensymphony.xwork2.ActionSupport;

import net.hctek.AnnouncerStation.service.IdentityServiceI;
import net.hctek.AnnouncerStation.util.ChineseUtill;



public class QrCodeAction extends ActionSupport{
	  private static final long serialVersionUID = 1L;
	  private static final int IMAGE_WIDTH = 50;
	  private static final int IMAGE_HEIGHT = 50;
	  private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;
	  private static final int FRAME_WIDTH = 2;
	  private static MultiFormatWriter mutiWriter = new MultiFormatWriter();
	  private String QrCoudeUrl;
	  @Autowired
	  private IdentityServiceI identityServiceI;
	  
	  
		public String execute(){
			try {
				if(ChineseUtill.isMessyCode(QrCoudeUrl)){
					setQrCoudeUrl(getQrCoudeUrl());
					System.out.println("true"+QrCoudeUrl);
				}else{
					System.out.println("false"+QrCoudeUrl);
				}
				
				String path = ServletActionContext.getServletContext().getRealPath("/img");
				/*String path = request.getServletContext().getRealPath("/");*/
				path = path+"/"+"logss.jpg";
				String QrCoudeUrlName = URLEncoder.encode(QrCoudeUrl, "utf-8");
				System.out.println(QrCoudeUrlName);
				System.out.println(URLDecoder.decode(QrCoudeUrlName, "utf-8"));
				String ip_number = "goatnet.net";
				if(ip_number != null && !ip_number.equals("")){
					String QrCoudeUrls = 
							"http://"+ip_number+":8080"+"/AnnouncerStation/download/download.jspx?filename="+QrCoudeUrlName+"";
					encode(QrCoudeUrls, 450, 450,path);
				}
				SimpleDateFormat bartDateFormat = new SimpleDateFormat
		  				("yyyy-MM-dd"); 
				Date date = new Date(); 
				Long i = 1L;
				identityServiceI.updataQrcodeCount(i,bartDateFormat.format(date));
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("生成二维码失败");
			}
			return NONE;
		}
	
	  public static void encode(String content, int width, int height,
		      String srcImagePath) {
		  	ServletActionContext.getResponse().setContentType("image/jpg");
		    try {
		      OutputStream out = ServletActionContext.getResponse().getOutputStream();
		      ImageIO.write(genBarcode(content, width, height, srcImagePath),
		          "jpg", out);
            out.flush();
            out.close();
		    } catch (Exception e) {
		      e.printStackTrace();
		      System.out.println("图片生成失败");
		    }
		  }
		  
		  private static BufferedImage genBarcode(String content, int width,
		      int height, String srcImagePath) throws WriterException,
		      IOException {
		    BufferedImage scaleImage = scale(srcImagePath, IMAGE_WIDTH,
		        IMAGE_HEIGHT, true);
		    int[][] srcPixels = new int[IMAGE_WIDTH][IMAGE_HEIGHT];
		    for (int i = 0; i < scaleImage.getWidth(); i++) {
		      for (int j = 0; j < scaleImage.getHeight(); j++) {
		        srcPixels[i][j] = scaleImage.getRGB(i, j);
		      }
		    }
		    Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>();
		    hint.put(EncodeHintType.CHARACTER_SET, "utf-8");
		    hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		    
		    BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE,
		        width, height, hint);
		    
		    int halfW = matrix.getWidth() / 2;
		    int halfH = matrix.getHeight() / 2;
		    int[] pixels = new int[width * height];
		    for (int y = 0; y < matrix.getHeight(); y++) {
		      for (int x = 0; x < matrix.getWidth(); x++) {
		        // ���Ͻ���ɫ,�����Լ���Ҫ������ɫ��Χ����ɫ   
		        if (x > 0 && x < 170 && y > 0 && y < 170) {
		          Color color = new Color(231, 144, 56);
		          int colorInt = color.getRGB();
		          pixels[y * width + x] = matrix.get(x, y) ? colorInt
		              : 16777215;
		        }
		        
		        else if (x > halfW - IMAGE_HALF_WIDTH
		            && x < halfW + IMAGE_HALF_WIDTH
		            && y > halfH - IMAGE_HALF_WIDTH
		            && y < halfH + IMAGE_HALF_WIDTH) {
		          pixels[y * width + x] = srcPixels[x - halfW
		              + IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH];
		        } else if ((x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH
		            && x < halfW - IMAGE_HALF_WIDTH + FRAME_WIDTH
		            && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
		            + IMAGE_HALF_WIDTH + FRAME_WIDTH)
		            || (x > halfW + IMAGE_HALF_WIDTH - FRAME_WIDTH
		                && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
		                && y > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
		                + IMAGE_HALF_WIDTH + FRAME_WIDTH)
		            || (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH
		                && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
		                && y > halfH - IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
		                - IMAGE_HALF_WIDTH + FRAME_WIDTH)
		            || (x > halfW - IMAGE_HALF_WIDTH - FRAME_WIDTH
		                && x < halfW + IMAGE_HALF_WIDTH + FRAME_WIDTH
		                && y > halfH + IMAGE_HALF_WIDTH - FRAME_WIDTH && y < halfH
		                + IMAGE_HALF_WIDTH + FRAME_WIDTH)) {
		          pixels[y * width + x] = 0xfffffff;
		          
		        } else {
		          
		          int num1 = (int) (50 - (50.0 - 13.0) / matrix.getHeight()
		              * (y + 1));
		          int num2 = (int) (165 - (165.0 - 72.0) / matrix.getHeight()
		              * (y + 1));
		          int num3 = (int) (162 - (162.0 - 107.0)
		              / matrix.getHeight() * (y + 1));
		          Color color = new Color(num1, num2, num3);
		          int colorInt = color.getRGB();
		          
		          pixels[y * width + x] = matrix.get(x, y) ? colorInt
		              : 16777215;
		            
		        }
		      }
		    }
		    BufferedImage image = new BufferedImage(width, height,
		        BufferedImage.TYPE_INT_RGB);
		    image.getRaster().setDataElements(0, 0, width, height, pixels);
		    return image;
		  }
		  
		  private static BufferedImage scale(String srcImageFile, int height,
		      int width, boolean hasFiller) throws IOException {
		    double ratio = 0.0; 
		    File file = new File(srcImageFile);
		    BufferedImage srcImage = ImageIO.read(file);
		    Image destImage = srcImage.getScaledInstance(width, height,
		        BufferedImage.SCALE_SMOOTH);
		      
		    if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) {
		      if (srcImage.getHeight() > srcImage.getWidth()) {
		        ratio = (new Integer(height)).doubleValue()
		            / srcImage.getHeight();
		      } else {
		        ratio = (new Integer(width)).doubleValue()
		            / srcImage.getWidth();
		      }
		      AffineTransformOp op = new AffineTransformOp(
		          AffineTransform.getScaleInstance(ratio, ratio), null);
		      destImage = op.filter(srcImage, null);
		    }
		    if (hasFiller) {
		      // ����
		      BufferedImage image = new BufferedImage(width, height,
		          BufferedImage.TYPE_INT_RGB);
		      Graphics2D graphic = image.createGraphics();
		      graphic.setColor(Color.white);
		      graphic.fillRect(0, 0, width, height);
		      if (width == destImage.getWidth(null))
		        graphic.drawImage(destImage, 0,
		            (height - destImage.getHeight(null)) / 2,
		            destImage.getWidth(null), destImage.getHeight(null),
		            Color.white, null);
		      else
		        graphic.drawImage(destImage,
		            (width - destImage.getWidth(null)) / 2, 0,
		            destImage.getWidth(null), destImage.getHeight(null),
		            Color.white, null);
		      graphic.dispose();
		      destImage = image;
		    }
		    return (BufferedImage) destImage;
		  }

		public String getQrCoudeUrl() {
			try {
				QrCoudeUrl = new String(QrCoudeUrl.getBytes("ISO-8859-1"),"UTF-8");
				return QrCoudeUrl;
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("转码失败");
				return null;
			}
		}

		public void setQrCoudeUrl(String qrCoudeUrl) {
			QrCoudeUrl = qrCoudeUrl;
		}
		  
		
}
